import numpy as np

# 生成十名学术五科成绩
x = np.random.randint(40, 100, [10, 5])
"""
[[81 40 62 50 96]
 [86 82 82 52 44]
 [60 69 45 84 77]
 [50 80 45 99 58]
 [75 53 44 84 88]
 [60 89 89 54 63]
 [93 73 90 43 79]
 [75 89 81 60 74]
 [47 59 85 41 53]
 [92 67 63 95 70]]
 """
x = x[5:, :4]
"""
[[92 83 51 43]
 [57 90 43 86]
 [87 78 51 53]
 [79 96 86 84]
 [79 98 84 65]]
"""
test_score = np.array([[92, 83, 51, 43],
                       [57, 90, 43, 86],
                       [87, 78, 51, 53],
                       [79, 96, 86, 84],
                       [79, 98, 84, 65]])

# 1. 逻辑运算
print(test_score > 60)
"""
[[ True  True False False]
 [False  True False  True]
 [ True  True False False]
 [ True  True  True  True]
 [ True  True  True  True]]
"""
# test_score[test_score > 60] = 1

# 2. 通用判断函数
# 全部符合才返回true否则返回false
np.all(test_score[0:2, :] > 60)
# 任意一个符合既可以返回ture否则返回false
np.any(test_score[0:2, :] > 60)

# 3. 三元运算符
np.where(test_score > 60, 1, 0)
np.where(np.logical_and(test_score > 60, test_score < 90), 1, 0)

# 4. 统计运算
print(np.max(test_score))  # 98
np.max(test_score)
np.mean(test_score)  # 平均值
np.min(test_score)

# 按照各科(列)进行统计,axios = 0 按列，axios = 1 按行
print(np.max(test_score, axis=0))  # [92 98 86 86]
np.max(test_score, axis=0)  # 每列的最大值
np.mean(test_score, axis=0)  # 平均值
np.min(test_score, axis=0)

# 统计每科axis=0最高分对应的学生下标
print(np.argmax(test_score, axis=0))  # [0 4 3 1]

# 数组与数的运算
print(test_score + 3)  # 每个元素+3
print(test_score / 2)  # 每个元素➗2
print(np.array([1, 2, 8, 9]) * 3)  # 每个元素*3
# 注意与列表的区别 *3 相当于复制粘贴3次
print([1, 2, 8, 9] * 3)  # [1, 2, 8, 9, 1, 2, 8, 9, 1, 2, 8, 9]

# 数组与数组的运算
"""
广播机制：
实现了shape不完全一致的数组运算：
shape从右往左看每列满足下面任意一个条件：
1.数组某一个维度相等
2.其中一个数组的某一维度为1
扩展维度小的数组，使其与维度大的数组shape相同
"""
arr1 = np.array([[1, 2, 3, 2, 1, 4], [5, 6, 1, 2, 3, 1]])
arr2 = np.array([[1], [3]])
"""
array([[2, 3, 4, 3, 2, 5],
       [8, 9, 4, 5, 6, 4]])
"""
print(arr1 + arr2)
"""
[[1, 2, 3, 2, 1, 4],  + [[1, 1, 1, 1, 1, 1],
 [5, 6, 1, 2, 3, 1]]     [3, 3, 3, 3, 3, 3]]
"""

# 矩阵乘法
a = np.array([[80, 86],
              [82, 80],
              [85, 78],
              [90, 90],
              [86, 82],
              [82, 90],
              [78, 80],
              [92, 94]])
b = np.array([[0.7], [0.3]])
c = np.dot(a, b)
"""
[[81.8]
 [81.4]
 [82.9]
 [90. ]
 [84.8]
 [84.4]
 [78.6]
 [92.6]]
"""
print(c)
d = np.dot(10, c)
